home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 2010 April / PCWorld0410.iso / redakcyjne / programy / MediaMonkey 3.1.0.1256 / MediaMonkey_3.1.0.1256.exe / {app} / Scripts / Stats.vbs < prev    next >
Text File  |  2009-04-22  |  67KB  |  1,361 lines

  1. ' !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  2. ' This file can be replaced  in one of the future versions,
  3. ' so please if you want to modify it, make  a copy, do your
  4. ' modifications  in that copy and  change Scripts.ini  file 
  5. ' appropriately. 
  6. ' If you do not do this, you will lose  all your changes in
  7. ' this script when you install a new version of MediaMonkey
  8. ' !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  9.  
  10. ' !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  11. ' MediaMonkey statistics script
  12. ' This script was adapted by TheRocket from the 
  13. ' MediaMonkey Web Extension (MMWBE) also made by myself.
  14. ' Coded in December 2004 - January 2005.
  15. ' Thanks to Rusty for his suggestions and letting me
  16. ' include this script into the next versions!
  17. ' It shows globaly the songs you have in your MediaMonkey,
  18. ' and what you listen often. It can be a great way to
  19. ' find what type of music a person likes.
  20. ' Send us new statistics ideas in the MediaMonkey Forum!
  21. ' !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  22.  
  23. Option Explicit
  24.  
  25. Public booStyleOn
  26.  
  27. Const intTopCount = 10
  28. Const mmAnchorRight = 4
  29. Const mmAnchorBottom = 8
  30. Const mmAlignTop = 1
  31. Const mmAlignBottom = 2
  32. Const mmAlignClient = 5
  33. Const mmListDropdown = 2
  34. Const mmFormScreenCenter = 4
  35.  
  36. 'Set English - United States system locale.
  37. SetLocale("en-us")
  38.  
  39. Sub ShowStats()
  40. Dim UI
  41. Dim Form
  42. Dim Foot
  43. Dim Btn
  44. Dim Btn2
  45. Dim WB
  46. Dim doc
  47. Dim DlgWidth
  48.  
  49.   Set UI = SDB.UI
  50.  
  51.   DlgWidth = 500
  52.  
  53.   ' Create the window to be shown
  54.   Set Form = UI.NewForm
  55.   Form.Common.SetRect 50, 50, DlgWidth, 400
  56.   Form.Common.MinWidth = 200
  57.   Form.Common.MinHeight = 150
  58.   Form.FormPosition = mmFormScreenCenter
  59.   Form.Caption = SDB.Localize("MediaMonkey Music Library Statistics")
  60.   Form.StayOnTop = True
  61.  
  62.   ' Create a panel at the bottom of the window
  63.   Set Foot = UI.NewPanel(Form)
  64.   Foot.Common.Align = mmAlignBottom
  65.   Foot.Common.Height = 35
  66.  
  67.   ' Create a button that saves the report
  68.   Set Btn2 = UI.NewButton(Foot)
  69.   Btn2.Caption = SDB.Localize("&Save as...")
  70.   Btn2.Common.SetRect DlgWidth - 261, 5, 150, 25
  71.   'Btn2.Common.Hint = SDB.Localize("Save this report")
  72.   Btn2.Common.Anchors = mmAnchorRight + mmAnchorBottom
  73.   Btn2.UseScript = Script.ScriptPath
  74.   Btn2.OnClickFunc = "SaveAs"
  75.  
  76.   ' Create a button that closes the window
  77.   Set Btn = UI.NewButton(Foot)
  78.   Btn.Caption = SDB.Localize("&Close")
  79.   Btn.Common.SetRect DlgWidth - 106, 5, 85, 25
  80.   'Btn.Common.Hint = SDB.Localize("Close this report")
  81.   Btn.Common.Anchors = mmAnchorRight + mmAnchorBottom
  82.   Btn.Cancel = True
  83.   Btn.UseScript = Script.ScriptPath
  84.   Btn.OnClickFunc = "OnClose"
  85.    
  86.   ' Create a web browser component
  87.   Set WB = UI.NewActiveX(Form, "Shell.Explorer")
  88.  
  89.   ' process background threads
  90.   SDB.ProcessMessages
  91.  
  92.   WB.Common.Align = mmAlignClient      ' Fill all client rectangle
  93.   WB.Common.ControlName = "WB"
  94.  
  95.   Form.SavePositionName = "StatisticsWindow"
  96.   Form.Common.Visible = True                ' Only show the form, don't wait for user input
  97.   SDB.Objects("Statistics") = Form  ' Save reference to the form somewhere, otherwise it would simply disappear
  98.   WB.SetHTMLDocument( BuildReport(false))
  99.  
  100.   ' process background threads
  101.   SDB.ProcessMessages
  102.  
  103. End Sub
  104.  
  105. Sub OnClose(Btn)
  106.   SDB.Objects("Statistics") = Nothing ' Remove the last reference to our form which also causes it to disappear
  107. End Sub
  108.  
  109. Function Style()
  110.   booStyleOn = Not booStyleOn
  111.   If booStyleOn Then
  112.     Style = ""
  113.   Else
  114.     Style = " class=""Dark"""
  115.   End If
  116. End Function
  117.  
  118. Public Function FormatFileSize(intFileLength)
  119. Dim strSize
  120.     strSize = SDB.Localize("Bytes")
  121.     If intFileLength >= 1024 Then
  122.       intFileLength = intFileLength / 1024
  123.       strSize = SDB.Localize("KB")
  124.     End If
  125.     If intFileLength >= 1024 Then
  126.       intFileLength = intFileLength / 1024
  127.       strSize = SDB.Localize("MB")
  128.     End If
  129.     If intFileLength >= 1024 Then
  130.       intFileLength = intFileLength / 1024
  131.       strSize = SDB.Localize("GB")
  132.     End If
  133.     If intFileLength >= 1024 Then
  134.       intFileLength = intFileLength / 1024
  135.       strSize = SDB.Localize("TB")
  136.     End If
  137.     strSize = " " & strSize
  138.     If intFileLength < 10 Then
  139.       FormatFileSize = FormatNumber(intFileLength,2)&strSize
  140.     Else
  141.       If intFileLength < 100 Then
  142.         FormatFileSize = FormatNumber(intFileLength,1)&strSize
  143.       Else
  144.         FormatFileSize = FormatNumber(intFileLength,0)&strSize
  145.       End If
  146.     End If
  147. End Function
  148.  
  149. Public Function FormatTime(intLength)
  150.   Dim strLength, intLengthHeures, intLengthMinutes, intLengthSecondes, datLength
  151.   Dim strTimeSeparator
  152.   'Find out the current time separator (for some locales, it is a period)
  153.   datLength = TimeSerial(11, 11, 11)
  154.   strLength = FormatDateTime(datLength,vbshorttime)
  155.   strTimeSeparator = left(replace(strLength,"1",""),1)
  156.  
  157.   intLength = CCur(intLength / 1000)
  158.   intLengthHeures = Int((intLength / 60) / 60)
  159.   intLengthMinutes = Int((intLength / 60) Mod 60)
  160.   intLengthSecondes = Int(intLength Mod 60)
  161.  
  162.   strLength = intLengthHeures & strTimeSeparator
  163.   if intLengthMinutes < 10 then strLength = strLength & "0"
  164.   strLength = strLength & intLengthMinutes & strTimeSeparator
  165.  
  166.   if intLengthSecondes < 10 then strLength = strLength & "0"
  167.   strLength = strLength & intLengthSecondes
  168.  
  169.   FormatTime = strLength
  170. End Function
  171.  
  172.  ' escape XML string
  173. Function MapXML(srcstring)
  174.   srcstring = Replace(srcstring, "&", "&")
  175.   srcstring = Replace(srcstring, "<", "<")
  176.   srcstring = Replace(srcstring, ">", ">")
  177.   Dim i
  178.   i=1
  179.   While i<=Len(srcstring)
  180.     ' process background threads
  181.     SDB.ProcessMessages
  182.  
  183.     If (AscW(Mid(srcstring, i, 1))>127) Then
  184.       srcstring = Mid( srcstring, 1, i-1)+"&#"+CStr( AscW( Mid( srcstring, i, 1)))+";"+Mid( srcstring, i+1, Len(srcstring))
  185.     End If
  186.     i=i+1
  187.   WEnd
  188.   If srcstring="" Then
  189.     srcstring = " "
  190.   End IF
  191.   MapXML = srcstring
  192. End Function
  193.  
  194.  
  195. Function ExtractText(ByVal inText, ByVal inDebut, ByVal inFin)
  196.     Dim pos1
  197.     Dim pos2
  198.  
  199.     pos1 = InStr(1, inText, inDebut)
  200.     If pos1 = 0 Then pos1 = 1 Else pos1 = pos1 + Len(inDebut)
  201.     pos2 = InStr(pos1, inText, inFin)
  202.     If pos2 < pos1 Then pos2 = Len(inText) + 1
  203.     ExtractText = Mid(inText, pos1, pos2 - pos1)
  204.     
  205. End Function
  206.  
  207. Function ExtractTextInvert(ByVal inText, ByVal inDebut, ByVal inFin)
  208.     ExtractTextInvert = StrReverse(ExtractText(StrReverse(inText), StrReverse(inDebut), StrReverse(inFin)))
  209. End Function
  210.  
  211. function ExtractPathName(strPath)
  212.   dim StrTemp
  213.   StrTemp= ExtractTextInvert(strPath,"","\")
  214.   ExtractPathName = Left(strPath, Len(strPath) - Len(StrTemp))
  215. end function
  216.  
  217. Function ShowRating(intNo, booForExport)
  218. Dim a
  219.   If intNo = -1 Then
  220.     ShowRating = " "
  221.   ElseIf intNo = 0 Then
  222.     if not booForExport then
  223.       ShowRating = "<img src=""" & ExtractPathName(script.scriptpath) & "\bomb.png"" border=""0"" width=""10"" height=""11"">"
  224.     else
  225.       ShowRating = "0"
  226.     end if
  227.   Else
  228. '    ShowRating = round(intNo / 10) / 2
  229.     For a = 20 To (intNo + 4) Step 20
  230.       ' process background threads
  231.       SDB.ProcessMessages
  232.       if not booForExport then
  233.         ShowRating = ShowRating & "<img src=""" & ExtractPathName(script.scriptpath) & "\star.png"" width=""10"" height=""11"" border=""0"">"
  234.       else
  235.         ShowRating = ShowRating & "*"
  236.       end if
  237.     Next
  238.   End If
  239.   If ((intNo + 4)  Mod 20) >= 10 Then
  240.     if not booForExport then
  241.       ShowRating = ShowRating & "<img src=""" & ExtractPathName(script.scriptpath) & "\half-star.png"" width=""10"" height=""11"" border=""0"">"
  242.     else
  243.       ShowRating = ShowRating & """
  244.     end if
  245.   End If
  246. End Function
  247.  
  248. function NoNull(VarCanBeNull, varWhenNull)
  249.   if IsNull (VarCanBeNull) Then
  250.     NoNull = varWhenNull
  251.   else
  252.     if IsNumeric (VarCanBeNull) Then
  253.       NoNull = VarCanBeNull
  254.     else
  255.       if VarType (VarCanBeNull) = vbString Then
  256.         if Len (VarCanBeNull) > 0 Then
  257.           NoNull = VarCanBeNull
  258.         else
  259.           NoNull = varWhenNull
  260.         end if
  261.       else
  262.         NoNull = varWhenNull
  263.       end if
  264.     end if
  265.   end if
  266. end function
  267.  
  268. Sub SaveAS(Btn)
  269.   Dim strExportTo
  270.   Dim booSave
  271.   Dim fout 
  272.   Dim fso
  273.  
  274.   With SDB.CommonDialog
  275.     .DefaultExt = "html"
  276.     '.FileName = SDB.Localize("Save AS...")
  277.     .Filter = "HTML (*.htm)|*.htm|All files (*.*)|*.*"
  278.     .Title = SDB.Localize("Exporting...")
  279.     .InitDir = SDB.IniFile.StringValue("Scripts", "LastExportStatsDir")
  280.     .ShowSave
  281.     booSave = .Ok
  282.     strExportTo = .FileName
  283.   End With
  284.  
  285.   if booSave then
  286.     ' Connect to the FileSystemObject
  287.     Set fso = SDB.Tools.FileSystem
  288.  
  289.     ' Create the output file 
  290.     Set fout = fso.CreateTextFile(strExportTo, True) 
  291.  
  292.     ' Write header line 
  293.     fout.Write BuildReport(true) 
  294.     ' Close the output file and finish 
  295.     fout.Close 
  296.     
  297.     set fout = nothing
  298.     set fso = nothing
  299.  
  300.   end if
  301.  
  302. end sub
  303.  
  304. Function BuildReport(booForExport)
  305.   Dim qryStats 
  306.   Dim strSQL
  307.   Dim intArtistsCount
  308.   Dim intArtistsCountPlayed
  309.   Dim intAlbumCount
  310.   Dim intAlbumsCountPlayed
  311.   Dim intGenreCount
  312.   Dim intGenreCountPlayed
  313.   Dim intLength
  314.   Dim intFileLength
  315.   Dim intLengthPlayed
  316.   Dim intFileLengthPlayed
  317.   Dim intYearCount
  318.   Dim intYearCountPlayed
  319.   Dim intPlaylistCount
  320.   Dim intPlaylistCountPlayed
  321.   Dim intPlayed
  322.   Dim intAllCount
  323.  
  324.   Dim strOut
  325.  
  326.   strOut = ""
  327.     
  328.   'Building base page
  329.   strOut = strOut & "<!DOCTYPE HTML PUBLIC ""-//W3C//DTD HTML 4.0 Transitional//EN"">" & vbcrlf
  330.   strOut = strOut & "<html>" & vbcrlf
  331.   strOut = strOut & "  <head>" & vbcrlf
  332.   strOut = strOut & "    <title>" & SDB.Localize("MediaMonkey Music Library Statistics") & "</title>" & vbcrlf
  333.   strOut = strOut & "  </head>" & vbcrlf
  334.  
  335.   strOut = strOut & "<STYLE TYPE=text/css>" & vbcrlf
  336.   strOut = strOut & "body{font-family:'Verdana',sans-serif; background-color:#FFFFFF; font-size:9pt; color:#000000;}" & vbcrlf
  337.   strOut = strOut & "H1{font-family:'Verdana',sans-serif; font-size:13pt; font-weight:bold; color:#AAAAAA; text-align:left}" & vbcrlf
  338.   strOut = strOut & "P{font-family:'Verdana',sans-serif; font-size:9pt; color:#000000;}" & vbcrlf
  339.   strOut = strOut & "TH{font-family:'Verdana',sans-serif; font-size:10pt; font-weight:bold; color:#000000; border-color:#000000; border-style: solid; border-left-width:0px; border-right-width:0px; border-top-width:0px; border-bottom-width:3px;}" & vbcrlf
  340.   strOut = strOut & "TD{font-family:'Verdana',sans-serif; font-size:9pt; color:#000000; border-color:#000000; border-style: solid; border-left-width:0px; border-right-width:0px; border-top-width:0px; border-bottom-width:1px;}" & vbcrlf
  341.   strOut = strOut & "TR.dark{background-color:#EEEEEE}" & vbcrlf
  342.   strOut = strOut & "TR.aleft TH{text-align:left}" & vbcrlf
  343.   strOut = strOut & "</STYLE>" & vbcrlf
  344.  
  345.   strOut = strOut & "  <body>" & vbcrlf
  346.   strOut = strOut & "    <H1>" & SDB.Localize("MediaMonkey Music Library Statistics") & "</H1>" & vbcrlf
  347.   
  348.   ' process background threads
  349.   SDB.ProcessMessages
  350.   
  351.   'Totals
  352.   strSQL = "SELECT Count(*) AS Nombre FROM Artists WHERE ID <> 0 AND Tracks>0"     ' Track artists only
  353.   Set qryStats = SDB.Database.OpenSQL(strSQL)
  354.   intArtistsCount = CLng(NoNull(qryStats.ValueByName("Nombre"),0))
  355.   
  356.   ' process background threads
  357.   SDB.ProcessMessages
  358.  
  359.   strSQL = "SELECT Count(Distinct Artists.ID) AS CountOfID FROM Artists WHERE Artists.ID IN ( SELECT ArtistsSongs.IDArtist FROM ArtistsSongs WHERE ArtistsSongs.PersonType = 1 AND ArtistsSongs.IDSong IN ( SELECT Played.IDSong FROM Played))"
  360.   Set qryStats = SDB.Database.OpenSQL(strSQL)
  361.   intArtistsCountPlayed = CLng(NoNull(qryStats.ValueByName("CountOfID"),0))
  362.   
  363.   ' process background threads
  364.   SDB.ProcessMessages
  365.  
  366.   strSQL = "SELECT Count(*) AS Nombre FROM Albums WHERE Album<>'' AND Album<>' '"
  367.   Set qryStats = SDB.Database.OpenSQL(strSQL)
  368.   intAlbumCount = CLng(NoNull(qryStats.ValueByName("Nombre"),0))
  369.   
  370.   ' process background threads
  371.   SDB.ProcessMessages
  372.  
  373.   strSQL = "SELECT Count(Distinct Albums.ID) AS CountOfID FROM Albums WHERE Albums.ID IN ( SELECT Songs.IDAlbum FROM Songs WHERE Songs.ID IN (SELECT Played.IDSong FROM Played))"
  374.   Set qryStats = SDB.Database.OpenSQL(strSQL)
  375.   intAlbumsCountPlayed = CLng(NoNull(qryStats.ValueByName("CountOfID"),0))
  376.   
  377.   ' process background threads
  378.   SDB.ProcessMessages
  379.  
  380.   strSQL = "SELECT Count(Genres.IDGenre) AS Nombre FROM Genres WHERE Genres.GenreName <> '' AND Genres.IDGenre IN (SELECT GenresSongs.IDGenre FROM GenresSongs)"
  381.   Set qryStats = SDB.Database.OpenSQL(strSQL)
  382.   intGenreCount = CLng(NoNull(qryStats.ValueByName("Nombre"),0))
  383.   
  384.   ' process background threads
  385.   SDB.ProcessMessages
  386.  
  387.   strSQL = "SELECT Count(Distinct Genres.IDGenre) AS CountOfID FROM Genres WHERE Genres.IDGenre IN (SELECT GenresSongs.IDGenre FROM GenresSongs WHERE GenresSongs.IDSong IN (SELECT Played.IDSong FROM Played))"
  388.   Set qryStats = SDB.Database.OpenSQL(strSQL)
  389.   intGenreCountPlayed = CLng(NoNull(qryStats.ValueByName("CountOfID"),0))
  390.  
  391.   ' process background threads
  392.   SDB.ProcessMessages
  393.  
  394.   strSQL = "SELECT Count(Distinct CAST((Songs.Year/10000) AS INTEGER)) AS Nombre FROM Songs WHERE Songs.Year > 0"
  395.   Set qryStats = SDB.Database.OpenSQL(strSQL)
  396.   intYearCount = CLng(NoNull(qryStats.ValueByName("Nombre"),0))
  397.  
  398.   ' process background threads
  399.   SDB.ProcessMessages
  400.  
  401.   strSQL = "SELECT Count(Distinct CAST((Songs.Year/10000) AS INTEGER)) AS CountOfID FROM Songs INNER JOIN Played ON Songs.ID = Played.IDSong WHERE Songs.Year > 0"
  402.   Set qryStats = SDB.Database.OpenSQL(strSQL)
  403.   intYearCountPlayed = CLng(NoNull(qryStats.ValueByName("CountOfID"),0))
  404.  
  405.   ' process background threads
  406.   SDB.ProcessMessages
  407.  
  408.   strSQL = "SELECT Count(*) AS Nombre FROM PlayLists WHERE (ISAutoPlayList ISNULL or IsAutoPlaylist=0)"
  409.   Set qryStats = SDB.Database.OpenSQL(strSQL)
  410.   intPlaylistCount = CLng(NoNull(qryStats.ValueByName("Nombre"),0))
  411.  
  412.   ' process background threads
  413.   SDB.ProcessMessages
  414.  
  415.   strSQL = "SELECT Count(Distinct PlayLists.IDPlaylist) AS CountOfID FROM "
  416.   strSQL = strSQL & " PlayLists WHERE PlayLists.IDPlaylist "
  417.   strSQL = strSQL & " IN (SELECT PlaylistSongs.IDPlaylist FROM PlaylistSongs WHERE PlaylistSongs.IDSong "
  418.   strSQL = strSQL & " IN (SELECT Played.IDSong FROM Played)) "
  419.   strSQL = strSQL & " AND (PlayLists.ISAutoPlayList ISNULL or Playlists.IsAutoPlaylist=0)"
  420.   Set qryStats = SDB.Database.OpenSQL(strSQL)
  421.   intPlaylistCountPlayed = CLng(NoNull(qryStats.ValueByName("CountOfID"),0))
  422.  
  423.   ' process background threads
  424.   SDB.ProcessMessages
  425.  
  426.   strSQL = "SELECT Count(Distinct Played.IDSong) AS Nombre FROM Played"
  427.   Set qryStats = SDB.Database.OpenSQL(strSQL)
  428.   intPlayed = CLng(NoNull(qryStats.ValueByName("Nombre"),0))
  429.  
  430.   ' process background threads
  431.   SDB.ProcessMessages
  432.  
  433.   strSQL = "SELECT Count(*) AS Nombre, Sum(Songs.SongLength) AS TotalLength, Sum(Songs.FileLength) AS TotalFileLength FROM Songs"
  434.   Set qryStats = SDB.Database.OpenSQL(strSQL)
  435.   intAllCount = CLng(NoNull(qryStats.StringByName("Nombre"),0))
  436.   intLength = CCur(NoNull(qryStats.ValueByName("TotalLength"),0))
  437.   intFileLength = CCur(NoNull(qryStats.ValueByName("TotalFileLength"),0))
  438.  
  439.   ' process background threads
  440.   SDB.ProcessMessages
  441.  
  442.   strSQL = "SELECT Sum(Songs.SongLength) AS TotalLength, Sum(Songs.FileLength) AS TotalFileLength FROM Songs WHERE Songs.ID IN (SELECT Played.IdSong FROM Played)"
  443.   Set qryStats = SDB.Database.OpenSQL(strSQL)
  444.   intLengthPlayed = CCur(NoNull(qryStats.ValueByName("TotalLength"),0))
  445.   intFileLengthPlayed = CCur(NoNull(qryStats.ValueByName("TotalFileLength"),0))
  446.  
  447.   ' process background threads
  448.   SDB.ProcessMessages
  449.  
  450.   strOut = strOut & "      <p/>" & vbcrlf
  451.   strOut = strOut & "        <table border=""0"" cellspacing=""0"" cellpadding=""4"" width=""100%"">" & vbcrlf
  452.   strOut = strOut & "          <tr><th colspan=""3"">" & SDB.Localize("Totals") & "</th></tr>" & vbcrlf
  453.   strOut = strOut & "          <tr class=""aleft""><th>" & SDB.Localize("Type") & "</th><th>" & SDB.Localize("Library") & "</th><th>" & SDB.Localize("Played") & "</th></tr>" & vbcrlf
  454.   strOut = strOut & "          <tr" & Style & "><td>" & SDB.Localize("Artists") & "</td><td>" & intArtistsCount & "</td><td>" & intArtistsCountPlayed & "</td></tr>" & vbcrlf
  455.   strOut = strOut & "          <tr" & Style & "><td>" & SDB.Localize("Albums") & "</td><td>" & intAlbumCount & "</td><td>" & intAlbumsCountPlayed & "</td></tr>" & vbcrlf
  456.   strOut = strOut & "          <tr" & Style & "><td>" & SDB.Localize("Genres") & "</td><td>" & intGenreCount & "</td><td>" & intGenreCountPlayed & "</td></tr>" & vbcrlf
  457.   strOut = strOut & "          <tr" & Style & "><td>" & SDB.Localize("Years") & "</td><td>" & intYearCount & "</td><td>" & intYearCountPlayed & "</td></tr>" & vbcrlf
  458.   strOut = strOut & "          <tr" & Style & "><td>" & SDB.Localize("Playlists") & "</td><td>" & intPlaylistCount & "</td><td>" & intPlaylistCountPlayed & "</td></tr>" & vbcrlf
  459.   strOut = strOut & "          <tr" & Style & "><td>" & SDB.Localize("Tracks") & "</td><td>" & intAllCount & "</td><td>" & intPlayed & "</td></tr>" & vbcrlf
  460.   strOut = strOut & "          <tr" & Style & "><td>" & SDB.Localize("Length") & " (h:mm:ss)</td><td>" & FormatTime(intLength) & "</td><td>" & FormatTime(intLengthPlayed) & "</td></tr>" & vbcrlf
  461.   strOut = strOut & "          <tr" & Style & "><td>" & SDB.Localize("File size") & "</td><td>" & FormatFileSize(intFileLength) & "</td><td>" & FormatFileSize(intFileLengthPlayed) & "</td></tr>" & vbcrlf
  462.   'strOut = strOut & "          <tr><td colspan=""3"">* = " & SDB.Localize("Parts of item played") & "</td></tr>" & vbcrlf
  463.   strOut = strOut & "        </table>" & vbcrlf
  464.   strOut = strOut & "      <p/>" & vbcrlf
  465.   
  466.   ' process background threads
  467.   SDB.ProcessMessages
  468.  
  469.   'Averages
  470.   Dim intAvgYear
  471.   Dim intAvgYearPlayed
  472.   Dim intAvgBitrate
  473.   Dim intAvgBitratePlayed
  474.   Dim intAvgRating
  475.   Dim intTracksPerAlbum
  476.   Dim intTracksPerAlbumPlayed
  477.   Dim intSongsPerGenre
  478.   Dim intSongsPerGenrePlayed
  479.   Dim intPlayPerDay
  480.   Dim intPlayedRating
  481.   Dim intSongsPerArtist
  482.   Dim intSongsPerArtistPlayed
  483.   Dim intSongsPerYear
  484.   Dim intSongsPerYearPlayed
  485.   'Dim intSongsPerRating
  486.   'Dim intSongsPerRatingPlayed
  487.  
  488.   strSQL = "SELECT Avg(Distinct CAST((Songs.Year/10000) AS INTEGER)) AS avgYear FROM Songs WHERE Songs.Year > 0"
  489.   Set qryStats = SDB.Database.OpenSQL(strSQL)
  490.   intAvgYear = CCur(NoNull(qryStats.ValueByName("avgYear"),0))
  491.  
  492.   ' process background threads
  493.   SDB.ProcessMessages
  494.  
  495.   strSQL = "SELECT Avg(Distinct Cast((Songs.Year/10000) AS Integer)) AS avgYearPlayed FROM Songs INNER JOIN Played ON Songs.ID = Played.IDSong WHERE Songs.Year > 0"
  496.   Set qryStats = SDB.Database.OpenSQL(strSQL)
  497.   intAvgYearPlayed = CCur(NoNull(qryStats.ValueByName("avgYearPlayed"),0))
  498.  
  499.   ' process background threads
  500.   SDB.ProcessMessages
  501.  
  502.   strSQL = "SELECT Avg(SongLength) AS AvgLength, Avg(FileLength) AS AvgFileLength, Avg(Bitrate) AS AvgBitrate FROM Songs"
  503.   Set qryStats = SDB.Database.OpenSQL(strSQL)
  504.   intLength = CCur(NoNull(qryStats.ValueByName("AvgLength"),0))
  505.   intFileLength = CCur(NoNull(qryStats.ValueByName("AvgFileLength"),0))
  506.   intAvgBitrate = CCur(NoNull(qryStats.ValueByName("AvgBitrate"),0))
  507.  
  508.   ' process background threads
  509.   SDB.ProcessMessages
  510.  
  511.   strSQL = "SELECT Avg(Songs.Bitrate) AS AvgBitratePlayed FROM Songs WHERE Songs.ID IN (SELECT Played.IDSong FROM Played)"
  512.   Set qryStats = SDB.Database.OpenSQL(strSQL)
  513.   intAvgBitratePlayed = CCur(NoNull(qryStats.ValueByName("AvgBitratePlayed"),0))
  514.  
  515.   ' process background threads
  516.   SDB.ProcessMessages
  517.  
  518.   strSQL = "SELECT Avg(Songs.Rating) AS AvgRating FROM Songs WHERE Songs.Rating >= 0"
  519.   Set qryStats = SDB.Database.OpenSQL(strSQL)
  520.   intAvgRating = CCur(NoNull(qryStats.ValueByName("AvgRating"),0))
  521.  
  522.   ' process background threads
  523.   SDB.ProcessMessages
  524.  
  525.   strSQL = "SELECT Avg(SongLength) AS AvgLength, Avg(FileLength) AS AvgFileLength FROM Songs INNER JOIN Played ON Songs.ID = Played.IdSong"
  526.   Set qryStats = SDB.Database.OpenSQL(strSQL)
  527.   intLengthPlayed = CCur(NoNull(qryStats.ValueByName("AvgLength"),0))
  528.   intFileLengthPlayed = CCur(NoNull(qryStats.ValueByName("AvgFileLength"),0))
  529.   
  530.   ' process background threads
  531.   SDB.ProcessMessages
  532.  
  533.   strSQL = "SELECT Count( Songs.ID) AS CountOfID FROM Songs WHERE (Songs.Album <> '') AND (Songs.Album NOTNULL)"
  534.   Set qryStats = SDB.Database.OpenSQL(strSQL)
  535.   if intAlbumCount > 0 then
  536.     intTracksPerAlbum = CCur(NoNull(qryStats.ValueByName("CountOfID"),0)) / intAlbumCount
  537.   else
  538.     intTracksPerAlbum = 0
  539.   End If
  540.   
  541.   ' process background threads
  542.   SDB.ProcessMessages
  543.  
  544.   strSQL = "SELECT Count( Songs.ID) AS CountOfID FROM Songs WHERE (Songs.Album <> '') AND (Songs.Album NOTNULL) AND Songs.IDAlbum IN "
  545.   strSQL = strSQL & "(SELECT Albums.ID FROM Albums WHERE Albums.ID IN ( SELECT Songs2.IDAlbum FROM Songs AS Songs2 WHERE Songs2.ID IN (SELECT Played.IDSong FROM Played)))"
  546.   
  547.   Set qryStats = SDB.Database.OpenSQL(strSQL)
  548.   if intAlbumsCountPlayed > 0 then
  549.     intTracksPerAlbumPlayed = CCur(NoNull(qryStats.ValueByName("CountOfID"),0)) / intAlbumsCountPlayed
  550.   else  
  551.     intTracksPerAlbumPlayed = 0
  552.   end If
  553.  
  554.   ' process background threads
  555.   SDB.ProcessMessages
  556.  
  557.   strSQL = "SELECT Avg(CountOfID) AS AVGPlayed FROM (SELECT Count(Played.IdSong) AS CountOfID " 
  558.   strSQL = strSQL & "FROM Played  "
  559.   strSQL = strSQL & "GROUP BY Cast(Played.PlayDate AS Integer))"
  560.   Set qryStats = SDB.Database.OpenSQL(strSQL)
  561.   intPlayPerDay = CCur(NoNull(qryStats.ValueByName("AVGPlayed"),0))
  562.  
  563.   ' process background threads
  564.   SDB.ProcessMessages
  565.  
  566.   strSQL = "SELECT Avg(Songs.Rating) AS AvgRatingPlayed FROM Songs WHERE Songs.Rating>0 AND PlayCounter>0"
  567.   Set qryStats = SDB.Database.OpenSQL(strSQL)
  568.   intPlayedRating = CCur(NoNull(qryStats.ValueByName("AvgRatingPlayed"),0))
  569.  
  570.   ' process background threads
  571.   SDB.ProcessMessages
  572.  
  573.   strSQL = "SELECT Count( GenresSongs.ID) AS CountOfID FROM GenresSongs"
  574.   Set qryStats = SDB.Database.OpenSQL(strSQL)
  575.   if intGenreCount > 0 then
  576.     intSongsPerGenre = CCur(NoNull(qryStats.ValueByName("CountOfID"),0)) / intGenreCount
  577.   else
  578.     intSongsPerGenre = 0
  579.   end If
  580.   
  581.   ' process background threads
  582.   SDB.ProcessMessages
  583.  
  584.   strSQL = "SELECT Count( GenresSongs.ID) AS CountOfID FROM GenresSongs WHERE GenresSongs.idGenre IN "
  585.   strSQL = strSQL & "       (SELECT GenresSongs2.IDGenre FROM GenresSongs AS GenresSongs2 WHERE GenresSongs2.IDSong IN "
  586.   strSQL = strSQL & "               (SELECT Played.IDSong FROM Played))"
  587.   Set qryStats = SDB.Database.OpenSQL(strSQL)
  588.   if intGenreCountPlayed > 0 then
  589.     intSongsPerGenrePlayed = CCur(NoNull(qryStats.ValueByName("CountOfID"),0)) / intGenreCountPlayed
  590.   else  
  591.     intSongsPerGenrePlayed = 0
  592.   end If  
  593.  
  594.   ' process background threads
  595.   SDB.ProcessMessages
  596.  
  597.   strSQL = "SELECT Count( ArtistsSongs.ID) AS CountOfID FROM ArtistsSongs WHERE ArtistsSongs.PersonType = 1"
  598.   Set qryStats = SDB.Database.OpenSQL(strSQL)
  599.   if intArtistsCount > 0 then
  600.     intSongsPerArtist = CCur(NoNull(qryStats.ValueByName("CountOfID"),0)) / intArtistsCount
  601.   else
  602.     intSongsPerArtist = 0
  603.   end If  
  604.  
  605.   ' process background threads
  606.   SDB.ProcessMessages
  607.  
  608.   strSQL = "SELECT Count( ArtistsSongs.ID) AS CountOfID FROM ArtistsSongs WHERE ArtistsSongs.PersonType = 1 AND ArtistsSongs.idArtist IN " 
  609.   strSQL = strSQL & "       (SELECT ArtistsSongs2.IDArtist FROM ArtistsSongs AS ArtistsSongs2 WHERE ArtistsSongs2.IDSong IN "
  610.   strSQL = strSQL & "               (SELECT Played.IDSong FROM Played))"
  611.   Set qryStats = SDB.Database.OpenSQL(strSQL)
  612.   if intArtistsCountPlayed > 0 then
  613.     intSongsPerArtistPlayed = CCur(NoNull(qryStats.ValueByName("CountOfID"),0)) / intArtistsCountPlayed
  614.   else
  615.     intSongsPerArtistPlayed = 0
  616.   end If  
  617.  
  618.   ' process background threads
  619.   SDB.ProcessMessages
  620.  
  621.   strSQL = "SELECT Avg(CountOfID) AS AVGYear FROM ("
  622.   strSQL = strSQL & "SELECT Count(Songs.ID) AS CountOfID "
  623.   'strSQL = strSQL & "FROM Songs "
  624.   strSQL = strSQL & "FROM Songs WHERE Songs.Year <> -1 "
  625.   strSQL = strSQL & "GROUP BY Songs.Year)"
  626.   Set qryStats = SDB.Database.OpenSQL(strSQL)
  627.   intSongsPerYear = CCur(NoNull(qryStats.ValueByName("AVGYear"),0))
  628.  
  629.   ' process background threads
  630.   SDB.ProcessMessages
  631.  
  632.   strSQL = "SELECT Avg(CountOfID) AS AVGYearPlayed FROM ("
  633.   strSQL = strSQL & "SELECT Count(Songs.ID) AS CountOfID "
  634.   strSQL = strSQL & "FROM Songs WHERE Songs.ID IN (SELECT Played.IDSong FROM Played) AND Songs.Year <> -1 "
  635.   strSQL = strSQL & "GROUP BY Songs.Year)"
  636.   Set qryStats = SDB.Database.OpenSQL(strSQL)
  637.   intSongsPerYearPlayed = CCur(NoNull(qryStats.ValueByName("AVGYearPlayed"),0))
  638.  
  639.   'strSQL = "SELECT Avg(CountOfID) AS AVGTracksRating FROM ("
  640.   'strSQL = strSQL & "SELECT Count(Songs.ID) AS CountOfID "
  641.   'strSQL = strSQL & "FROM Songs WHERE Songs.Rating>0 "
  642.   'strSQL = strSQL & "GROUP BY Songs.Rating)"
  643.   'Set qryStats = SDB.Database.OpenSQL(strSQL)
  644.   'intSongsPerRating = CCur(NoNull(qryStats.ValueByName("AVGTracksRating"),0))
  645.  
  646.   'strSQL = "SELECT Avg(CountOfID) AS AVGTracksRatingPlayed FROM ("
  647.   'strSQL = strSQL & "SELECT Count(Songs.ID) AS CountOfID "
  648.   'strSQL = strSQL & "FROM Songs INNER JOIN Played ON Songs.ID = Played.IDSong WHERE Songs.Rating>0 "
  649.   'strSQL = strSQL & "GROUP BY Songs.Rating)"
  650.   'Set qryStats = SDB.Database.OpenSQL(strSQL)
  651.   'intSongsPerRatingPlayed = CCur(NoNull(qryStats.ValueByName("AVGTracksRatingPlayed"),0))
  652.  
  653.   ' process background threads
  654.   SDB.ProcessMessages
  655.  
  656.   strOut = strOut & "        <table border=""0"" cellspacing=""0"" cellpadding=""4"" width=""100%"">" & vbcrlf
  657.   strOut = strOut & "          <tr><th colspan=""3"">" & SDB.Localize("Averages") & "</th></tr>" & vbcrlf
  658.   strOut = strOut & "          <tr class=""aleft""><th>" & SDB.Localize("Type") & "</th><th>" & SDB.Localize("Library") & "</th><th>" & SDB.Localize("Played") & "</th></tr>" & vbcrlf
  659.   strOut = strOut & "          <tr" & Style & "><td>" & SDB.Localize("Tracks per Artist") & "</td><td>" & Round(intSongsPerArtist, 1) & "</td><td>" & Round(intSongsPerArtistPlayed, 1) & "</td></tr>" & vbcrlf
  660.   strOut = strOut & "          <tr" & Style & "><td>" & SDB.Localize("Tracks per Album") & "</td><td>" & Round(intTracksPerAlbum, 1) & "</td><td>" & Round(intTracksPerAlbumPlayed, 1) & "</td></tr>" & vbcrlf
  661.   strOut = strOut & "          <tr" & Style & "><td>" & SDB.Localize("Tracks per Genre") & "</td><td>" & Round(intSongsPerGenre, 1) & "</td><td>" & Round(intSongsPerGenrePlayed, 1) & "</td></tr>" & vbcrlf
  662.   strOut = strOut & "          <tr" & Style & "><td>" & SDB.Localize("Tracks per Year") & "</td><td>" & Round(intSongsPerYear, 1) & "</td><td>" & Round(intSongsPerYearPlayed, 1) & "</td></tr>" & vbcrlf
  663.   'strOut = strOut & "          <tr" & Style & "><td>" & SDB.Localize("Tracks per Rating") & "</td><td>" & Round(intSongsPerRating, 1) & "</td><td>" & Round(intSongsPerRatingPlayed, 1) & "</td></tr>" & vbcrlf
  664.   strOut = strOut & "          <tr" & Style & "><td>" & SDB.Localize("Bitrate (kbps)") & "</td><td>" & Round(intAvgBitrate/1000) & "</td><td>" & Round(intAvgBitratePlayed/1000) & "</td></tr>" & vbcrlf
  665.   strOut = strOut & "          <tr" & Style & "><td>" & SDB.Localize("Year") & "</td><td>" & Round(intAvgYear) & "</td><td>" & Round(intAvgYearPlayed) & "</td></tr>" & vbcrlf
  666.   strOut = strOut & "          <tr" & Style & "><td>" & SDB.Localize("Tracks played per day") & "</td><td>-</td><td>" & Round(intPlayPerDay, 1) & "</td></tr>" & vbcrlf
  667.   strOut = strOut & "          <tr" & Style & "><td>" & SDB.Localize("Rating") & "</td><td>" & ShowRating(Round(intAvgRating),booForExport) & "</td><td>" & ShowRating(Round(intPlayedRating),booForExport) & "</td></tr>" & vbcrlf
  668.   strOut = strOut & "          <tr" & Style & "><td>" & SDB.Localize("Length") & " (h:mm:ss)</td><td>" & FormatTime(intLength) & "</td><td>" & FormatTime(intLengthPlayed) & "</td></tr>" & vbcrlf
  669.   strOut = strOut & "          <tr" & Style & "><td>" & SDB.Localize("File size") & "</td><td>" & FormatFileSize(intFileLength) & "</td><td>" & FormatFileSize(intFileLengthPlayed) & "</td></tr>" & vbcrlf
  670.   strOut = strOut & "        </table>" & vbcrlf
  671.   strOut = strOut & "      <p/>" & vbcrlf
  672.  
  673.   ' process background threads
  674.   SDB.ProcessMessages
  675.  
  676.   'Top 10 Artists
  677.   strOut = strOut & "        <table border=""0"" cellspacing=""0"" cellpadding=""4"" width=""100%"">" & vbcrlf
  678.   strOut = strOut & "          <tr><th colspan=""4"">" & SDB.LocalizedFormat("Top %d Artists", intTopCount, 0, 0) & "</th></tr>" & vbcrlf
  679.   strOut = strOut & "          <tr class=""aleft"">" & vbcrlf
  680.   strOut = strOut & "            <th>" & SDB.Localize("Tracks") & "</th>" & vbcrlf
  681.   strOut = strOut & "            <th>" & SDB.Localize("Artist") & "</th>" & vbcrlf
  682.   strOut = strOut & "            <th>" & SDB.Localize("Length") & "</th>" & vbcrlf
  683.   strOut = strOut & "            <th>" & SDB.Localize("File size") & "</th>" & vbcrlf
  684.   strOut = strOut & "          </tr>" & vbcrlf
  685.   
  686.   strSQL = "SELECT Count(Songs.ID) AS CountOfID, Sum(SongLength) AS TotalLength, Sum(FileLength) AS TotalFileLength, Artists.Artist "
  687.   strSQL = strSQL &  "FROM ArtistsSongs, Songs, Artists "
  688.   strSQL = strSQL &  "WHERE ArtistsSongs.PersonType = 1 AND Songs.ID = ArtistsSongs.IDSong AND ArtistsSongs.IDArtist = Artists.ID "
  689.   strSQL = strSQL &  "GROUP BY ArtistsSongs.IDArtist "
  690.   strSQL = strSQL &  "ORDER BY Count(Songs.ID) DESC LIMIT " & intTopCount & ""  
  691.   
  692.   Set qryStats = SDB.Database.OpenSQL(strSQL)
  693.   While Not qryStats.EOF
  694.  
  695.   ' process background threadsE
  696.   SDB.ProcessMessages
  697.  
  698.   strOut = strOut & "          <tr" & Style() & ">" & vbcrlf
  699.   strOut = strOut & "            <td>" & qryStats.StringByName("CountOfID") & "</td>" & vbcrlf
  700.   strOut = strOut & "            <td>" & MapXML(qryStats.StringByName("Artist")) & "</td>" & vbcrlf
  701.   strOut = strOut & "            <td>" & FormatTime(CCur(NoNull(qryStats.ValueByName("TotalLength"), 0))) & "</td>" & vbcrlf
  702.   strOut = strOut & "            <td>" & FormatFileSize(CCur(NoNull(qryStats.ValueByName("TotalFileLength"), 0))) & "</td>" & vbcrlf
  703.   strOut = strOut & "          </tr>" & vbcrlf
  704.     qryStats.Next
  705.   Wend
  706.   strOut = strOut & "        </table>" & vbcrlf
  707.   strOut = strOut & "      <p/>" & vbcrlf
  708.   
  709.   ' process background threads
  710.   SDB.ProcessMessages
  711.  
  712.   'Top 10 Artists Played
  713.   strOut = strOut & "        <table border=""0"" cellspacing=""0"" cellpadding=""4"" width=""100%"">" & vbcrlf
  714.   strOut = strOut & "          <tr><th colspan=""4"">" & SDB.LocalizedFormat("Top %d Artists played", intTopCount, 0, 0) & "</th></tr>" & vbcrlf
  715.   strOut = strOut & "          <tr class=""aleft"">" & vbcrlf
  716.   strOut = strOut & "            <th>" & SDB.Localize("Tracks") & "</th>" & vbcrlf
  717.   strOut = strOut & "            <th>" & SDB.Localize("Artist") & "</th>" & vbcrlf
  718.   strOut = strOut & "            <th>" & SDB.Localize("Length") & "</th>" & vbcrlf
  719.   strOut = strOut & "            <th>" & SDB.Localize("File size") & "</th>" & vbcrlf
  720.   strOut = strOut & "          </tr>" & vbcrlf
  721.    
  722.   strSQL = "SELECT Sum(PlayCounter) AS CountOfID, Sum(SongLength) AS TotalLength, Sum(FileLength) AS TotalFileLength, Artists.Artist "
  723.   strSQL = strSQL &  "FROM ArtistsSongs, Songs, Artists "
  724.   strSQL = strSQL &  "WHERE ArtistsSongs.PersonType = 1 AND Songs.ID = ArtistsSongs.IDSong AND Songs.ID IN (SELECT Played.IDSong FROM Played) AND ArtistsSongs.IDArtist = Artists.ID "
  725.   strSQL = strSQL &  "GROUP BY ArtistsSongs.IDArtist "
  726.   strSQL = strSQL &  "ORDER BY Sum(PlayCounter) DESC LIMIT " & intTopCount & "" 
  727.  
  728.   Set qryStats = SDB.Database.OpenSQL(strSQL)
  729.   While Not qryStats.EOF
  730.  
  731.   ' process background threads
  732.   SDB.ProcessMessages
  733.  
  734.   strOut = strOut & "          <tr" & Style() & ">" & vbcrlf
  735.   strOut = strOut & "            <td>" & qryStats.StringByName("CountOfID") & "</td>" & vbcrlf
  736.   strOut = strOut & "            <td>" & MapXML(qryStats.StringByName("Artist")) & "</td>" & vbcrlf
  737.   strOut = strOut & "            <td>" & FormatTime(CCur(NoNull(qryStats.ValueByName("TotalLength"), 0))) & "</td>" & vbcrlf
  738.   strOut = strOut & "            <td>" & FormatFileSize(CCur(NoNull(qryStats.ValueByName("TotalFileLength"), 0))) & "</td>" & vbcrlf
  739.   strOut = strOut & "          </tr>" & vbcrlf
  740.     qryStats.Next
  741.   Wend
  742.   strOut = strOut & "        </table>" & vbcrlf
  743.   strOut = strOut & "      <p/>" & vbcrlf
  744.  
  745.   'Top 10 Albums
  746.   strOut = strOut & "        <table border=""0"" cellspacing=""0"" cellpadding=""4"" width=""100%"">" & vbcrlf
  747.   strOut = strOut & "          <tr><th colspan=""4"">" & SDB.LocalizedFormat("Top %d Albums", intTopCount, 0, 0) & "</th></tr>" & vbcrlf
  748.   strOut = strOut & "          <tr class=""aleft"">" & vbcrlf
  749.   strOut = strOut & "            <th>" & SDB.Localize("Rating") & "</th>" & vbcrlf
  750.   strOut = strOut & "            <th>" & SDB.Localize("Album") & "</th>" & vbcrlf
  751.   strOut = strOut & "            <th>" & SDB.Localize("Length") & "</th>" & vbcrlf
  752.   strOut = strOut & "            <th>" & SDB.Localize("File size") & "</th>" & vbcrlf
  753.   strOut = strOut & "          </tr>" & vbcrlf
  754.   
  755.   strSQL = "SELECT Songs.AlbumArtist AS Artist, Albums.Album AS Album, Avg( Songs.Rating) AS Rating, Sum(Songs.SongLength) AS TotalLength, Sum(Songs.FileLength) AS TotalFileLength "
  756.   strSQL = strSQL & "FROM Songs, Albums "
  757.   strSQL = strSQL & "WHERE Albums.ID <> 0 AND Albums.Album <> '' AND Albums.ID = Songs.IDAlbum "
  758.   strSQL = strSQL & "GROUP BY Songs.IDAlbum, Albums.Album "
  759.   strSQL = strSQL & "ORDER BY Rating Desc, TotalLength Desc Limit " & intTopCount & "" 
  760.   Set qryStats = SDB.Database.OpenSQL(strSQL)
  761.   While Not qryStats.EOF
  762.   
  763. ' process background threads
  764.   SDB.ProcessMessages
  765.  
  766.   strOut = strOut & "          <tr" & Style() & ">" & vbcrlf
  767.   strOut = strOut & "            <td>" & ShowRating(qryStats.StringByName("Rating"),booForExport) & "</td>" & vbcrlf
  768.   strOut = strOut & "            <td>" & MapXML(qryStats.StringByName("Artist")) & " - " & MapXML(qryStats.StringByName("Album")) & "</td>" & vbcrlf
  769.   strOut = strOut & "            <td>" & FormatTime(CCur(NoNull(qryStats.ValueByName("TotalLength"), 0))) & "</td>" & vbcrlf
  770.   strOut = strOut & "            <td>" & FormatFileSize(CCur(NoNull(qryStats.ValueByName("TotalFileLength"), 0))) & "</td>" & vbcrlf
  771.   strOut = strOut & "          </tr>" & vbcrlf
  772.     qryStats.Next
  773.   Wend
  774.   strOut = strOut & "        </table>" & vbcrlf
  775.   strOut = strOut & "      <p/>" & vbcrlf
  776.  
  777.   'Top 10 Albums played
  778.   strOut = strOut & "        <table border=""0"" cellspacing=""0"" cellpadding=""4"" width=""100%"">" & vbcrlf
  779.   strOut = strOut & "          <tr><th colspan=""4"">" & SDB.LocalizedFormat("Top %d Albums played", intTopCount, 0, 0) & "</th></tr>" & vbcrlf
  780.   strOut = strOut & "          <tr class=""aleft"">" & vbcrlf
  781.   strOut = strOut & "            <th>" & SDB.Localize("Tracks") & "</th>" & vbcrlf
  782.   strOut = strOut & "            <th>" & SDB.Localize("Album") & "</th>" & vbcrlf
  783.   strOut = strOut & "            <th>" & SDB.Localize("Length") & "</th>" & vbcrlf
  784.   strOut = strOut & "            <th>" & SDB.Localize("File size") & "</th>" & vbcrlf
  785.   strOut = strOut & "          </tr>" & vbcrlf
  786.   
  787.   strSQL = "SELECT Songs.AlbumArtist AS Artist, Albums.Album AS Album, Sum( PlayCounter) AS CountOfID, Sum(Songs.SongLength) AS TotalLength, Sum(Songs.FileLength) AS TotalFileLength "
  788.   strSQL = strSQL & "FROM Songs, Albums "
  789.   strSQL = strSQL & "WHERE Albums.ID <> 0 AND Albums.Album <> '' AND Albums.ID = Songs.IDAlbum AND "
  790.   strSQL = strSQL & "Songs.ID IN (SELECT Played.IDSong FROM Played) "
  791.   strSQL = strSQL & "GROUP BY Songs.IDAlbum, Albums.Album "
  792.   strSQL = strSQL & "ORDER BY Sum( PlayCounter) Desc Limit " & intTopCount & "" 
  793.   
  794.   Set qryStats = SDB.Database.OpenSQL(strSQL)
  795.   While Not qryStats.EOF
  796.  
  797.   ' process background threads
  798.   SDB.ProcessMessages
  799.  
  800.   strOut = strOut & "          <tr" & Style() & ">" & vbcrlf
  801.   strOut = strOut & "            <td>" & qryStats.StringByName("CountOfID") & "</td>" & vbcrlf
  802.   strOut = strOut & "            <td>" & MapXML(qryStats.StringByName("Artist")) & " - " & MapXML(qryStats.StringByName("Album")) & "</td>" & vbcrlf
  803.   strOut = strOut & "            <td>" & FormatTime(CCur(NoNull(qryStats.ValueByName("TotalLength"), 0))) & "</td>" & vbcrlf
  804.   strOut = strOut & "            <td>" & FormatFileSize(CCur(NoNull(qryStats.ValueByName("TotalFileLength"), 0))) & "</td>" & vbcrlf
  805.   strOut = strOut & "          </tr>" & vbcrlf
  806.     qryStats.Next
  807.   Wend
  808.   strOut = strOut & "        </table>" & vbcrlf
  809.   strOut = strOut & "      <p/>" & vbcrlf
  810.   
  811.   ' process background threads
  812.   SDB.ProcessMessages
  813.  
  814.   'Top 10 Genres
  815.   strOut = strOut & "        <table border=""0"" cellspacing=""0"" cellpadding=""4"" width=""100%"">" & vbcrlf
  816.   strOut = strOut & "          <tr><th colspan=""4"">" & SDB.LocalizedFormat("Top %d Genres", intTopCount, 0, 0) & "</th></tr>" & vbcrlf
  817.   strOut = strOut & "          <tr class=""aleft"">" & vbcrlf
  818.   strOut = strOut & "            <th>" & SDB.Localize("Tracks") & "</th>" & vbcrlf
  819.   strOut = strOut & "            <th>" & SDB.Localize("Genre") & "</th>" & vbcrlf
  820.   strOut = strOut & "            <th>" & SDB.Localize("Length") & "</th>" & vbcrlf
  821.   strOut = strOut & "            <th>" & SDB.Localize("File size") & "</th>" & vbcrlf
  822.   strOut = strOut & "          </tr>" & vbcrlf
  823.   
  824.   strSQL = "SELECT Count(Songs.ID) AS CountOfID, Sum(Songs.SongLength) AS TotalLength, Sum(Songs.FileLength) AS TotalFileLength, Genres.GenreName FROM GenresSongs, Songs, Genres WHERE Songs.ID = GenresSongs.IDSong AND GenresSongs.IDGenre = Genres.IDGenre GROUP BY GenresSongs.IDGenre ORDER BY Count(Songs.ID) DESC LIMIT " & intTopCount & ""
  825.   
  826.   Set qryStats = SDB.Database.OpenSQL(strSQL)
  827.   While Not qryStats.EOF
  828.  
  829.   ' process background threads
  830.   SDB.ProcessMessages
  831.  
  832.   strOut = strOut & "          <tr" & Style() & ">" & vbcrlf
  833.   strOut = strOut & "            <td>" & qryStats.StringByName("CountOfID") & "</td>" & vbcrlf
  834.   strOut = strOut & "            <td>" & MapXML(qryStats.StringByName("GenreName")) & "</td>" & vbcrlf
  835.   strOut = strOut & "            <td>" & FormatTime(CCur(NoNull(qryStats.ValueByName("TotalLength"), 0))) & "</td>" & vbcrlf
  836.   strOut = strOut & "            <td>" & FormatFileSize(CCur(NoNull(qryStats.ValueByName("TotalFileLength"), 0))) & "</td>" & vbcrlf
  837.   strOut = strOut & "          </tr>" & vbcrlf
  838.     qryStats.Next
  839.   Wend
  840.   strOut = strOut & "        </table>" & vbcrlf
  841.   strOut = strOut & "      <p/>" & vbcrlf
  842.   
  843.   ' process background threads
  844.   SDB.ProcessMessages
  845.  
  846.   'Top 10 genres played
  847.   strOut = strOut & "        <table border=""0"" cellspacing=""0"" cellpadding=""4"" width=""100%"">" & vbcrlf
  848.   strOut = strOut & "          <tr><th colspan=""4"">" & SDB.LocalizedFormat("Top %d Genres played", intTopCount, 0, 0) & "</th></tr>" & vbcrlf
  849.   strOut = strOut & "          <tr class=""aleft"">" & vbcrlf
  850.   strOut = strOut & "            <th>" & SDB.Localize("Tracks") & "</th>" & vbcrlf
  851.   strOut = strOut & "            <th>" & SDB.Localize("Genre") & "</th>" & vbcrlf
  852.   strOut = strOut & "            <th>" & SDB.Localize("Length") & "</th>" & vbcrlf
  853.   strOut = strOut & "            <th>" & SDB.Localize("File size") & "</th>" & vbcrlf
  854.   strOut = strOut & "          </tr>" & vbcrlf
  855.   
  856.   strSQL = "SELECT Count(Songs.ID) AS CountOfID, Sum(Songs.SongLength) AS TotalLength, Sum(Songs.FileLength) AS TotalFileLength, Genres.GenreName FROM GenresSongs, Songs, Genres WHERE Songs.ID = GenresSongs.IDSong AND Songs.ID IN (SELECT Played.IDSong FROM Played) AND GenresSongs.IDGenre = Genres.IDGenre GROUP BY GenresSongs.IDGenre ORDER BY Count(Songs.ID) DESC LIMIT " & intTopCount & ""
  857.   
  858.   Set qryStats = SDB.Database.OpenSQL(strSQL)
  859.   While Not qryStats.EOF
  860.  
  861.   ' process background threads
  862.   SDB.ProcessMessages
  863.  
  864.   strOut = strOut & "          <tr" & Style() & ">" & vbcrlf
  865.   strOut = strOut & "            <td>" & qryStats.StringByName("CountOfID") & "</td>" & vbcrlf
  866.   strOut = strOut & "            <td>" & MapXML(qryStats.StringByName("GenreName")) & "</td>" & vbcrlf
  867.   strOut = strOut & "            <td>" & FormatTime(CCur(NoNull(qryStats.ValueByName("TotalLength"), 0))) & "</td>" & vbcrlf
  868.   strOut = strOut & "            <td>" & FormatFileSize(CCur(NoNull(qryStats.ValueByName("TotalFileLength"), 0))) & "</td>" & vbcrlf
  869.   strOut = strOut & "          </tr>" & vbcrlf
  870.     qryStats.Next
  871.   Wend
  872.   strOut = strOut & "        </table>" & vbcrlf
  873.   strOut = strOut & "      <p/>" & VbCrLf
  874.  
  875.   ' process background threads
  876.   SDB.ProcessMessages
  877.  
  878.   'ratings
  879.   strOut = strOut & "        <table border=""0"" cellspacing=""0"" cellpadding=""4"" width=""100%"">" & vbcrlf
  880.   strOut = strOut & "          <tr><th colspan=""4"">" & SDB.Localize("Ratings") & "</th></tr>" & vbcrlf
  881.   strOut = strOut & "          <tr class=""aleft"">" & vbcrlf
  882.   strOut = strOut & "            <th>" & SDB.Localize("Tracks") & "</th>" & vbcrlf
  883.   strOut = strOut & "            <th>" & SDB.Localize("Rating") & "</th>" & vbcrlf
  884.   strOut = strOut & "            <th>" & SDB.Localize("Length") & "</th>" & vbcrlf
  885.   strOut = strOut & "            <th>" & SDB.Localize("File size") & "</th>" & vbcrlf
  886.   strOut = strOut & "          </tr>" & vbcrlf
  887.  
  888.   '96 - 100 ratings
  889.   strSQL = "SELECT Songs.Rating, Count(Songs.ID) AS CountOfID, Sum(SongLength) AS TotalLength, Sum(FileLength) AS TotalFileLength FROM Songs WHERE (Songs.Rating >= 96) AND (Songs.Rating <= 100)"
  890.   Set qryStats = SDB.Database.OpenSQL(strSQL)
  891.  
  892.   If CLng(qryStats.StringByName("CountOfID")) > 0 Then
  893.     While Not qryStats.EOF
  894.  
  895.       ' process background threads
  896.       SDB.ProcessMessages
  897.  
  898.       strOut = strOut & "          <tr" & Style() & ">" & vbcrlf
  899.       strOut = strOut & "            <td>" & qryStats.StringByName("CountOfID") & "</td>" & vbcrlf
  900.       strOut = strOut & "            <td>" & ShowRating(qryStats.StringByName("Rating"),booForExport) & "</td>" & vbcrlf
  901.       strOut = strOut & "            <td>" & FormatTime(CCur(NoNull(qryStats.ValueByName("TotalLength"), 0))) & "</td>" & vbcrlf
  902.       strOut = strOut & "            <td>" & FormatFileSize(CCur(NoNull(qryStats.ValueByName("TotalFileLength"), 0))) & "</td>" & vbcrlf
  903.       strOut = strOut & "          </tr>" & vbcrlf
  904.       qryStats.Next
  905.     Wend
  906.   End If
  907.  
  908.   '86 - 95 ratings
  909.   strSQL = "SELECT Songs.Rating, Count(Songs.ID) AS CountOfID, Sum(SongLength) AS TotalLength, Sum(FileLength) AS TotalFileLength FROM Songs WHERE (Songs.Rating >= 86) AND (Songs.Rating <= 95)"
  910.   Set qryStats = SDB.Database.OpenSQL(strSQL)
  911.  
  912.   If CLng(qryStats.StringByName("CountOfID")) > 0 Then
  913.     While Not qryStats.EOF
  914.  
  915.       ' process background threads
  916.       SDB.ProcessMessages
  917.  
  918.       strOut = strOut & "          <tr" & Style() & ">" & vbcrlf
  919.       strOut = strOut & "            <td>" & qryStats.StringByName("CountOfID") & "</td>" & vbcrlf
  920.       strOut = strOut & "            <td>" & ShowRating(qryStats.StringByName("Rating"),booForExport) & "</td>" & vbcrlf
  921.       strOut = strOut & "            <td>" & FormatTime(CCur(NoNull(qryStats.ValueByName("TotalLength"), 0))) & "</td>" & vbcrlf
  922.       strOut = strOut & "            <td>" & FormatFileSize(CCur(NoNull(qryStats.ValueByName("TotalFileLength"), 0))) & "</td>" & vbcrlf
  923.       strOut = strOut & "          </tr>" & vbcrlf
  924.       qryStats.Next
  925.     Wend
  926.   End If
  927.  
  928.   '76 - 85 ratings
  929.   strSQL = "SELECT Songs.Rating, Count(Songs.ID) AS CountOfID, Sum(SongLength) AS TotalLength, Sum(FileLength) AS TotalFileLength FROM Songs WHERE (Songs.Rating >= 76) AND (Songs.Rating <= 85)"
  930.   Set qryStats = SDB.Database.OpenSQL(strSQL)
  931.  
  932.   If CLng(qryStats.StringByName("CountOfID")) > 0 Then
  933.     While Not qryStats.EOF
  934.  
  935.       ' process background threads
  936.       SDB.ProcessMessages
  937.  
  938.       strOut = strOut & "          <tr" & Style() & ">" & vbcrlf
  939.       strOut = strOut & "            <td>" & qryStats.StringByName("CountOfID") & "</td>" & vbcrlf
  940.       strOut = strOut & "            <td>" & ShowRating(qryStats.StringByName("Rating"),booForExport) & "</td>" & vbcrlf
  941.       strOut = strOut & "            <td>" & FormatTime(CCur(NoNull(qryStats.ValueByName("TotalLength"), 0))) & "</td>" & vbcrlf
  942.       strOut = strOut & "            <td>" & FormatFileSize(CCur(NoNull(qryStats.ValueByName("TotalFileLength"), 0))) & "</td>" & vbcrlf
  943.       strOut = strOut & "          </tr>" & vbcrlf
  944.       qryStats.Next
  945.     Wend
  946.   End If
  947.  
  948.   '66 - 75 ratings
  949.   strSQL = "SELECT Songs.Rating, Count(Songs.ID) AS CountOfID, Sum(SongLength) AS TotalLength, Sum(FileLength) AS TotalFileLength FROM Songs WHERE (Songs.Rating >= 66) AND (Songs.Rating <= 75)"
  950.   Set qryStats = SDB.Database.OpenSQL(strSQL)
  951.  
  952.   If CLng(qryStats.StringByName("CountOfID")) > 0 Then
  953.     While Not qryStats.EOF
  954.  
  955.       ' process background threads
  956.       SDB.ProcessMessages
  957.  
  958.       strOut = strOut & "          <tr" & Style() & ">" & vbcrlf
  959.       strOut = strOut & "            <td>" & qryStats.StringByName("CountOfID") & "</td>" & vbcrlf
  960.       strOut = strOut & "            <td>" & ShowRating(qryStats.StringByName("Rating"),booForExport) & "</td>" & vbcrlf
  961.       strOut = strOut & "            <td>" & FormatTime(CCur(NoNull(qryStats.ValueByName("TotalLength"), 0))) & "</td>" & vbcrlf
  962.       strOut = strOut & "            <td>" & FormatFileSize(CCur(NoNull(qryStats.ValueByName("TotalFileLength"), 0))) & "</td>" & vbcrlf
  963.       strOut = strOut & "          </tr>" & vbcrlf
  964.       qryStats.Next
  965.     Wend
  966.   End If
  967.  
  968.   '56 - 65 ratings
  969.   strSQL = "SELECT Songs.Rating, Count(Songs.ID) AS CountOfID, Sum(SongLength) AS TotalLength, Sum(FileLength) AS TotalFileLength FROM Songs WHERE (Songs.Rating >= 56) AND (Songs.Rating <= 65)"
  970.   Set qryStats = SDB.Database.OpenSQL(strSQL)
  971.  
  972.   If CLng(qryStats.StringByName("CountOfID")) > 0 Then
  973.     While Not qryStats.EOF
  974.  
  975.       ' process background threads
  976.       SDB.ProcessMessages
  977.  
  978.       strOut = strOut & "          <tr" & Style() & ">" & vbcrlf
  979.       strOut = strOut & "            <td>" & qryStats.StringByName("CountOfID") & "</td>" & vbcrlf
  980.       strOut = strOut & "            <td>" & ShowRating(qryStats.StringByName("Rating"),booForExport) & "</td>" & vbcrlf
  981.       strOut = strOut & "            <td>" & FormatTime(CCur(NoNull(qryStats.ValueByName("TotalLength"), 0))) & "</td>" & vbcrlf
  982.       strOut = strOut & "            <td>" & FormatFileSize(CCur(NoNull(qryStats.ValueByName("TotalFileLength"), 0))) & "</td>" & vbcrlf
  983.       strOut = strOut & "          </tr>" & vbcrlf
  984.       qryStats.Next
  985.     Wend
  986.   End If
  987.  
  988.   '46 - 55 ratings
  989.   strSQL = "SELECT Songs.Rating, Count(Songs.ID) AS CountOfID, Sum(SongLength) AS TotalLength, Sum(FileLength) AS TotalFileLength FROM Songs WHERE (Songs.Rating >= 46) AND (Songs.Rating <= 55)"
  990.   Set qryStats = SDB.Database.OpenSQL(strSQL)
  991.  
  992.   If CLng(qryStats.StringByName("CountOfID")) > 0 Then
  993.     While Not qryStats.EOF
  994.  
  995.       ' process background threads
  996.       SDB.ProcessMessages
  997.  
  998.       strOut = strOut & "          <tr" & Style() & ">" & vbcrlf
  999.       strOut = strOut & "            <td>" & qryStats.StringByName("CountOfID") & "</td>" & vbcrlf
  1000.       strOut = strOut & "            <td>" & ShowRating(qryStats.StringByName("Rating"),booForExport) & "</td>" & vbcrlf
  1001.       strOut = strOut & "            <td>" & FormatTime(CCur(NoNull(qryStats.ValueByName("TotalLength"), 0))) & "</td>" & vbcrlf
  1002.       strOut = strOut & "            <td>" & FormatFileSize(CCur(NoNull(qryStats.ValueByName("TotalFileLength"), 0))) & "</td>" & vbcrlf
  1003.       strOut = strOut & "          </tr>" & vbcrlf
  1004.       qryStats.Next
  1005.     Wend
  1006.   End If
  1007.  
  1008.   '36 - 45 ratings
  1009.   strSQL = "SELECT Songs.Rating, Count(Songs.ID) AS CountOfID, Sum(SongLength) AS TotalLength, Sum(FileLength) AS TotalFileLength FROM Songs WHERE (Songs.Rating >= 36) AND (Songs.Rating <= 45)"
  1010.   Set qryStats = SDB.Database.OpenSQL(strSQL)
  1011.  
  1012.   If CLng(qryStats.StringByName("CountOfID")) > 0 Then
  1013.     While Not qryStats.EOF
  1014.  
  1015.       ' process background threads
  1016.       SDB.ProcessMessages
  1017.  
  1018.       strOut = strOut & "          <tr" & Style() & ">" & vbcrlf
  1019.       strOut = strOut & "            <td>" & qryStats.StringByName("CountOfID") & "</td>" & vbcrlf
  1020.       strOut = strOut & "            <td>" & ShowRating(qryStats.StringByName("Rating"),booForExport) & "</td>" & vbcrlf
  1021.       strOut = strOut & "            <td>" & FormatTime(CCur(NoNull(qryStats.ValueByName("TotalLength"), 0))) & "</td>" & vbcrlf
  1022.       strOut = strOut & "            <td>" & FormatFileSize(CCur(NoNull(qryStats.ValueByName("TotalFileLength"), 0))) & "</td>" & vbcrlf
  1023.       strOut = strOut & "          </tr>" & vbcrlf
  1024.       qryStats.Next
  1025.     Wend
  1026.   End If
  1027.  
  1028.   '26 - 35 ratings
  1029.   strSQL = "SELECT Songs.Rating, Count(Songs.ID) AS CountOfID, Sum(SongLength) AS TotalLength, Sum(FileLength) AS TotalFileLength FROM Songs WHERE (Songs.Rating >= 26) AND (Songs.Rating <= 35)"
  1030.   Set qryStats = SDB.Database.OpenSQL(strSQL)
  1031.  
  1032.   If CLng(qryStats.StringByName("CountOfID")) > 0 Then
  1033.     While Not qryStats.EOF
  1034.  
  1035.       ' process background threads
  1036.       SDB.ProcessMessages
  1037.  
  1038.       strOut = strOut & "          <tr" & Style() & ">" & vbcrlf
  1039.       strOut = strOut & "            <td>" & qryStats.StringByName("CountOfID") & "</td>" & vbcrlf
  1040.       strOut = strOut & "            <td>" & ShowRating(qryStats.StringByName("Rating"),booForExport) & "</td>" & vbcrlf
  1041.       strOut = strOut & "            <td>" & FormatTime(CCur(NoNull(qryStats.ValueByName("TotalLength"), 0))) & "</td>" & vbcrlf
  1042.       strOut = strOut & "            <td>" & FormatFileSize(CCur(NoNull(qryStats.ValueByName("TotalFileLength"), 0))) & "</td>" & vbcrlf
  1043.       strOut = strOut & "          </tr>" & vbcrlf
  1044.       qryStats.Next
  1045.     Wend
  1046.   End If
  1047.  
  1048.   '16 - 25 ratings
  1049.   strSQL = "SELECT Songs.Rating, Count(Songs.ID) AS CountOfID, Sum(SongLength) AS TotalLength, Sum(FileLength) AS TotalFileLength FROM Songs WHERE (Songs.Rating >= 16) AND (Songs.Rating <= 25)"
  1050.   Set qryStats = SDB.Database.OpenSQL(strSQL)
  1051.  
  1052.   If CLng(qryStats.StringByName("CountOfID")) > 0 Then
  1053.     While Not qryStats.EOF
  1054.  
  1055.       ' process background threads
  1056.       SDB.ProcessMessages
  1057.  
  1058.       strOut = strOut & "          <tr" & Style() & ">" & vbcrlf
  1059.       strOut = strOut & "            <td>" & qryStats.StringByName("CountOfID") & "</td>" & vbcrlf
  1060.       strOut = strOut & "            <td>" & ShowRating(qryStats.StringByName("Rating"),booForExport) & "</td>" & vbcrlf
  1061.       strOut = strOut & "            <td>" & FormatTime(CCur(NoNull(qryStats.ValueByName("TotalLength"), 0))) & "</td>" & vbcrlf
  1062.       strOut = strOut & "            <td>" & FormatFileSize(CCur(NoNull(qryStats.ValueByName("TotalFileLength"), 0))) & "</td>" & vbcrlf
  1063.       strOut = strOut & "          </tr>" & vbcrlf
  1064.       qryStats.Next
  1065.     Wend
  1066.   End If
  1067.  
  1068.   '6 - 15 ratings
  1069.   strSQL = "SELECT Songs.Rating, Count(Songs.ID) AS CountOfID, Sum(SongLength) AS TotalLength, Sum(FileLength) AS TotalFileLength FROM Songs WHERE (Songs.Rating >= 6) AND (Songs.Rating <= 15)"
  1070.   Set qryStats = SDB.Database.OpenSQL(strSQL)
  1071.  
  1072.   If CLng(qryStats.StringByName("CountOfID")) > 0 Then
  1073.     While Not qryStats.EOF
  1074.  
  1075.       ' process background threads
  1076.       SDB.ProcessMessages
  1077.  
  1078.       strOut = strOut & "          <tr" & Style() & ">" & vbcrlf
  1079.       strOut = strOut & "            <td>" & qryStats.StringByName("CountOfID") & "</td>" & vbcrlf
  1080.       strOut = strOut & "            <td>" & ShowRating(qryStats.StringByName("Rating"),booForExport) & "</td>" & vbcrlf
  1081.       strOut = strOut & "            <td>" & FormatTime(CCur(NoNull(qryStats.ValueByName("TotalLength"), 0))) & "</td>" & vbcrlf
  1082.       strOut = strOut & "            <td>" & FormatFileSize(CCur(NoNull(qryStats.ValueByName("TotalFileLength"), 0))) & "</td>" & vbcrlf
  1083.       strOut = strOut & "          </tr>" & vbcrlf
  1084.       qryStats.Next
  1085.     Wend
  1086.   End If
  1087.  
  1088.   '0 ratings
  1089.   strSQL = "SELECT Songs.Rating, Count(Songs.ID) AS CountOfID, Sum(SongLength) AS TotalLength, Sum(FileLength) AS TotalFileLength FROM Songs WHERE Songs.Rating = 0"
  1090.   Set qryStats = SDB.Database.OpenSQL(strSQL)
  1091.  
  1092.   If CLng(qryStats.StringByName("CountOfID")) > 0 Then
  1093.     While Not qryStats.EOF
  1094.  
  1095.       ' process background threads
  1096.       SDB.ProcessMessages
  1097.  
  1098.       strOut = strOut & "          <tr" & Style() & ">" & vbcrlf
  1099.       strOut = strOut & "            <td>" & qryStats.StringByName("CountOfID") & "</td>" & vbcrlf
  1100.       strOut = strOut & "            <td>" & ShowRating(qryStats.StringByName("Rating"),booForExport) & "</td>" & vbcrlf
  1101.       strOut = strOut & "            <td>" & FormatTime(CCur(NoNull(qryStats.ValueByName("TotalLength"), 0))) & "</td>" & vbcrlf
  1102.       strOut = strOut & "            <td>" & FormatFileSize(CCur(NoNull(qryStats.ValueByName("TotalFileLength"), 0))) & "</td>" & vbcrlf
  1103.       strOut = strOut & "          </tr>" & vbcrlf
  1104.       qryStats.Next
  1105.     Wend
  1106.   End If
  1107.  
  1108.   strOut = strOut & "        </table>" & vbcrlf
  1109.   strOut = strOut & "      <p/>" & vbcrlf
  1110.  
  1111.   'rating played
  1112.   strOut = strOut & "        <table border=""0"" cellspacing=""0"" cellpadding=""4"" width=""100%"">" & vbcrlf
  1113.   strOut = strOut & "          <tr><th colspan=""4"">" & SDB.Localize("Ratings played") & "</th></tr>" & vbcrlf
  1114.   strOut = strOut & "          <tr class=""aleft"">" & vbcrlf
  1115.   strOut = strOut & "            <th>" & SDB.Localize("Tracks") & "</th>" & vbcrlf
  1116.   strOut = strOut & "            <th>" & SDB.Localize("Rating") & "</th>" & vbcrlf
  1117.   strOut = strOut & "            <th>" & SDB.Localize("Length") & "</th>" & vbcrlf
  1118.   strOut = strOut & "            <th>" & SDB.Localize("File size") & "</th>" & vbcrlf
  1119.   strOut = strOut & "          </tr>" & vbcrlf
  1120.  
  1121.   '96 - 100 ratings played
  1122.   strSQL = "SELECT Songs.Rating, Count(Songs.ID) AS CountOfID, Sum(SongLength) AS TotalLength, Sum(FileLength) AS TotalFileLength FROM Songs WHERE (Songs.Rating >= 96) AND (Songs.Rating <= 100) AND Songs.ID IN (SELECT Played.IDSong FROM Played)"  
  1123.   Set qryStats = SDB.Database.OpenSQL(strSQL)
  1124.  
  1125.   If CLng(qryStats.StringByName("CountOfID")) > 0 Then
  1126.     While Not qryStats.EOF
  1127.  
  1128.       ' process background threads
  1129.       SDB.ProcessMessages
  1130.  
  1131.       strOut = strOut & "          <tr" & Style() & ">" & vbcrlf
  1132.       strOut = strOut & "            <td>" & qryStats.StringByName("CountOfID") & "</td>" & vbcrlf
  1133.       strOut = strOut & "            <td>" & ShowRating(qryStats.StringByName("Rating"),booForExport) & "</td>" & vbcrlf
  1134.       strOut = strOut & "            <td>" & FormatTime(CCur(NoNull(qryStats.ValueByName("TotalLength"), 0))) & "</td>" & vbcrlf
  1135.       strOut = strOut & "            <td>" & FormatFileSize(CCur(NoNull(qryStats.ValueByName("TotalFileLength"), 0))) & "</td>" & vbcrlf
  1136.       strOut = strOut & "          </tr>" & vbcrlf
  1137.       qryStats.Next
  1138.     Wend
  1139.   End If
  1140.  
  1141.   '86 - 95 ratings played
  1142.   strSQL = "SELECT Songs.Rating, Count(Songs.ID) AS CountOfID, Sum(SongLength) AS TotalLength, Sum(FileLength) AS TotalFileLength FROM Songs WHERE (Songs.Rating >= 86) AND (Songs.Rating <= 95) AND Songs.ID IN (SELECT Played.IDSong FROM Played)"
  1143.   Set qryStats = SDB.Database.OpenSQL(strSQL)
  1144.  
  1145.   If CLng(qryStats.StringByName("CountOfID")) > 0 Then
  1146.     While Not qryStats.EOF
  1147.  
  1148.       ' process background threads
  1149.       SDB.ProcessMessages
  1150.  
  1151.       strOut = strOut & "          <tr" & Style() & ">" & vbcrlf
  1152.       strOut = strOut & "            <td>" & qryStats.StringByName("CountOfID") & "</td>" & vbcrlf
  1153.       strOut = strOut & "            <td>" & ShowRating(qryStats.StringByName("Rating"),booForExport) & "</td>" & vbcrlf
  1154.       strOut = strOut & "            <td>" & FormatTime(CCur(NoNull(qryStats.ValueByName("TotalLength"), 0))) & "</td>" & vbcrlf
  1155.       strOut = strOut & "            <td>" & FormatFileSize(CCur(NoNull(qryStats.ValueByName("TotalFileLength"), 0))) & "</td>" & vbcrlf
  1156.       strOut = strOut & "          </tr>" & vbcrlf
  1157.       qryStats.Next
  1158.     Wend
  1159.   End If
  1160.  
  1161.   '76 - 85 ratings played
  1162.   strSQL = "SELECT Songs.Rating, Count(Songs.ID) AS CountOfID, Sum(SongLength) AS TotalLength, Sum(FileLength) AS TotalFileLength FROM Songs WHERE (Songs.Rating >= 76) AND (Songs.Rating <= 85) AND Songs.ID IN (SELECT Played.IDSong FROM Played)"
  1163.   Set qryStats = SDB.Database.OpenSQL(strSQL)
  1164.  
  1165.   If CLng(qryStats.StringByName("CountOfID")) > 0 Then
  1166.     While Not qryStats.EOF
  1167.  
  1168.       ' process background threads
  1169.       SDB.ProcessMessages
  1170.  
  1171.       strOut = strOut & "          <tr" & Style() & ">" & vbcrlf
  1172.       strOut = strOut & "            <td>" & qryStats.StringByName("CountOfID") & "</td>" & vbcrlf
  1173.       strOut = strOut & "            <td>" & ShowRating(qryStats.StringByName("Rating"),booForExport) & "</td>" & vbcrlf
  1174.       strOut = strOut & "            <td>" & FormatTime(CCur(NoNull(qryStats.ValueByName("TotalLength"), 0))) & "</td>" & vbcrlf
  1175.       strOut = strOut & "            <td>" & FormatFileSize(CCur(NoNull(qryStats.ValueByName("TotalFileLength"), 0))) & "</td>" & vbcrlf
  1176.       strOut = strOut & "          </tr>" & vbcrlf
  1177.       qryStats.Next
  1178.     Wend
  1179.   End If
  1180.  
  1181.   '66 - 75 ratings played
  1182.   strSQL = "SELECT Songs.Rating, Count(Songs.ID) AS CountOfID, Sum(SongLength) AS TotalLength, Sum(FileLength) AS TotalFileLength FROM Songs WHERE (Songs.Rating >= 66) AND (Songs.Rating <= 75) AND Songs.ID IN (SELECT Played.IDSong FROM Played)"
  1183.   Set qryStats = SDB.Database.OpenSQL(strSQL)
  1184.  
  1185.   If CLng(qryStats.StringByName("CountOfID")) > 0 Then
  1186.     While Not qryStats.EOF
  1187.  
  1188.       ' process background threads
  1189.       SDB.ProcessMessages
  1190.  
  1191.       strOut = strOut & "          <tr" & Style() & ">" & vbcrlf
  1192.       strOut = strOut & "            <td>" & qryStats.StringByName("CountOfID") & "</td>" & vbcrlf
  1193.       strOut = strOut & "            <td>" & ShowRating(qryStats.StringByName("Rating"),booForExport) & "</td>" & vbcrlf
  1194.       strOut = strOut & "            <td>" & FormatTime(CCur(NoNull(qryStats.ValueByName("TotalLength"), 0))) & "</td>" & vbcrlf
  1195.       strOut = strOut & "            <td>" & FormatFileSize(CCur(NoNull(qryStats.ValueByName("TotalFileLength"), 0))) & "</td>" & vbcrlf
  1196.       strOut = strOut & "          </tr>" & vbcrlf
  1197.       qryStats.Next
  1198.     Wend
  1199.   End If
  1200.  
  1201.   '56 - 65 ratings played
  1202.   strSQL = "SELECT Songs.Rating, Count(Songs.ID) AS CountOfID, Sum(SongLength) AS TotalLength, Sum(FileLength) AS TotalFileLength FROM Songs WHERE (Songs.Rating >= 56) AND (Songs.Rating <= 65) AND Songs.ID IN (SELECT Played.IDSong FROM Played)"
  1203.   Set qryStats = SDB.Database.OpenSQL(strSQL)
  1204.  
  1205.   If CLng(qryStats.StringByName("CountOfID")) > 0 Then
  1206.     While Not qryStats.EOF
  1207.  
  1208.       ' process background threads
  1209.       SDB.ProcessMessages
  1210.  
  1211.       strOut = strOut & "          <tr" & Style() & ">" & vbcrlf
  1212.       strOut = strOut & "            <td>" & qryStats.StringByName("CountOfID") & "</td>" & vbcrlf
  1213.       strOut = strOut & "            <td>" & ShowRating(qryStats.StringByName("Rating"),booForExport) & "</td>" & vbcrlf
  1214.       strOut = strOut & "            <td>" & FormatTime(CCur(NoNull(qryStats.ValueByName("TotalLength"), 0))) & "</td>" & vbcrlf
  1215.       strOut = strOut & "            <td>" & FormatFileSize(CCur(NoNull(qryStats.ValueByName("TotalFileLength"), 0))) & "</td>" & vbcrlf
  1216.       strOut = strOut & "          </tr>" & vbcrlf
  1217.       qryStats.Next
  1218.     Wend
  1219.   End If
  1220.  
  1221.   '46 - 55 ratings played
  1222.   strSQL = "SELECT Songs.Rating, Count(Songs.ID) AS CountOfID, Sum(SongLength) AS TotalLength, Sum(FileLength) AS TotalFileLength FROM Songs WHERE (Songs.Rating >= 46) AND (Songs.Rating <= 55) AND Songs.ID IN (SELECT Played.IDSong FROM Played)"
  1223.   Set qryStats = SDB.Database.OpenSQL(strSQL)
  1224.  
  1225.   If CLng(qryStats.StringByName("CountOfID")) > 0 Then
  1226.     While Not qryStats.EOF
  1227.  
  1228.       ' process background threads
  1229.       SDB.ProcessMessages
  1230.  
  1231.       strOut = strOut & "          <tr" & Style() & ">" & vbcrlf
  1232.       strOut = strOut & "            <td>" & qryStats.StringByName("CountOfID") & "</td>" & vbcrlf
  1233.       strOut = strOut & "            <td>" & ShowRating(qryStats.StringByName("Rating"),booForExport) & "</td>" & vbcrlf
  1234.       strOut = strOut & "            <td>" & FormatTime(CCur(NoNull(qryStats.ValueByName("TotalLength"), 0))) & "</td>" & vbcrlf
  1235.       strOut = strOut & "            <td>" & FormatFileSize(CCur(NoNull(qryStats.ValueByName("TotalFileLength"), 0))) & "</td>" & vbcrlf
  1236.       strOut = strOut & "          </tr>" & vbcrlf
  1237.       qryStats.Next
  1238.     Wend
  1239.   End If
  1240.  
  1241.   '36 - 45 ratings played
  1242.   strSQL = "SELECT Songs.Rating, Count(Songs.ID) AS CountOfID, Sum(SongLength) AS TotalLength, Sum(FileLength) AS TotalFileLength FROM Songs WHERE (Songs.Rating >= 36) AND (Songs.Rating <= 45) AND Songs.ID IN (SELECT Played.IDSong FROM Played)"
  1243.   Set qryStats = SDB.Database.OpenSQL(strSQL)
  1244.  
  1245.   If CLng(qryStats.StringByName("CountOfID")) > 0 Then
  1246.     While Not qryStats.EOF
  1247.  
  1248.       ' process background threads
  1249.       SDB.ProcessMessages
  1250.  
  1251.       strOut = strOut & "          <tr" & Style() & ">" & vbcrlf
  1252.       strOut = strOut & "            <td>" & qryStats.StringByName("CountOfID") & "</td>" & vbcrlf
  1253.       strOut = strOut & "            <td>" & ShowRating(qryStats.StringByName("Rating"),booForExport) & "</td>" & vbcrlf
  1254.       strOut = strOut & "            <td>" & FormatTime(CCur(NoNull(qryStats.ValueByName("TotalLength"), 0))) & "</td>" & vbcrlf
  1255.       strOut = strOut & "            <td>" & FormatFileSize(CCur(NoNull(qryStats.ValueByName("TotalFileLength"), 0))) & "</td>" & vbcrlf
  1256.       strOut = strOut & "          </tr>" & vbcrlf
  1257.       qryStats.Next
  1258.     Wend
  1259.   End If
  1260.  
  1261.   '26 - 35 ratings played
  1262.   strSQL = "SELECT Songs.Rating, Count(Songs.ID) AS CountOfID, Sum(SongLength) AS TotalLength, Sum(FileLength) AS TotalFileLength FROM Songs WHERE (Songs.Rating >= 26) AND (Songs.Rating <= 35) AND Songs.ID IN (SELECT Played.IDSong FROM Played)"
  1263.   Set qryStats = SDB.Database.OpenSQL(strSQL)
  1264.  
  1265.   If CLng(qryStats.StringByName("CountOfID")) > 0 Then
  1266.     While Not qryStats.EOF
  1267.  
  1268.       ' process background threads
  1269.       SDB.ProcessMessages
  1270.  
  1271.       strOut = strOut & "          <tr" & Style() & ">" & vbcrlf
  1272.       strOut = strOut & "            <td>" & qryStats.StringByName("CountOfID") & "</td>" & vbcrlf
  1273.       strOut = strOut & "            <td>" & ShowRating(qryStats.StringByName("Rating"),booForExport) & "</td>" & vbcrlf
  1274.       strOut = strOut & "            <td>" & FormatTime(CCur(NoNull(qryStats.ValueByName("TotalLength"), 0))) & "</td>" & vbcrlf
  1275.       strOut = strOut & "            <td>" & FormatFileSize(CCur(NoNull(qryStats.ValueByName("TotalFileLength"), 0))) & "</td>" & vbcrlf
  1276.       strOut = strOut & "          </tr>" & vbcrlf
  1277.       qryStats.Next
  1278.     Wend
  1279.   End If
  1280.  
  1281.   '16 - 25 ratings played
  1282.   strSQL = "SELECT Songs.Rating, Count(Songs.ID) AS CountOfID, Sum(SongLength) AS TotalLength, Sum(FileLength) AS TotalFileLength FROM Songs WHERE (Songs.Rating >= 16) AND (Songs.Rating <= 25) AND Songs.ID IN (SELECT Played.IDSong FROM Played)"
  1283.   Set qryStats = SDB.Database.OpenSQL(strSQL)
  1284.  
  1285.   If CLng(qryStats.StringByName("CountOfID")) > 0 Then
  1286.     While Not qryStats.EOF
  1287.  
  1288.       ' process background threads
  1289.       SDB.ProcessMessages
  1290.  
  1291.       strOut = strOut & "          <tr" & Style() & ">" & vbcrlf
  1292.       strOut = strOut & "            <td>" & qryStats.StringByName("CountOfID") & "</td>" & vbcrlf
  1293.       strOut = strOut & "            <td>" & ShowRating(qryStats.StringByName("Rating"),booForExport) & "</td>" & vbcrlf
  1294.       strOut = strOut & "            <td>" & FormatTime(CCur(NoNull(qryStats.ValueByName("TotalLength"), 0))) & "</td>" & vbcrlf
  1295.       strOut = strOut & "            <td>" & FormatFileSize(CCur(NoNull(qryStats.ValueByName("TotalFileLength"), 0))) & "</td>" & vbcrlf
  1296.       strOut = strOut & "          </tr>" & vbcrlf
  1297.       qryStats.Next
  1298.     Wend
  1299.   End If
  1300.  
  1301.   '6 - 15 ratings played
  1302.   strSQL = "SELECT Songs.Rating, Count(Songs.ID) AS CountOfID, Sum(SongLength) AS TotalLength, Sum(FileLength) AS TotalFileLength FROM Songs WHERE (Songs.Rating >= 6) AND (Songs.Rating <= 15) AND Songs.ID IN (SELECT Played.IDSong FROM Played)"
  1303.   Set qryStats = SDB.Database.OpenSQL(strSQL)
  1304.  
  1305.   If CLng(qryStats.StringByName("CountOfID")) > 0 Then
  1306.     While Not qryStats.EOF
  1307.  
  1308.       ' process background threads
  1309.       SDB.ProcessMessages
  1310.  
  1311.       strOut = strOut & "          <tr" & Style() & ">" & vbcrlf
  1312.       strOut = strOut & "            <td>" & qryStats.StringByName("CountOfID") & "</td>" & vbcrlf
  1313.       strOut = strOut & "            <td>" & ShowRating(qryStats.StringByName("Rating"),booForExport) & "</td>" & vbcrlf
  1314.       strOut = strOut & "            <td>" & FormatTime(CCur(NoNull(qryStats.ValueByName("TotalLength"), 0))) & "</td>" & vbcrlf
  1315.       strOut = strOut & "            <td>" & FormatFileSize(CCur(NoNull(qryStats.ValueByName("TotalFileLength"), 0))) & "</td>" & vbcrlf
  1316.       strOut = strOut & "          </tr>" & vbcrlf
  1317.       qryStats.Next
  1318.     Wend
  1319.   End If
  1320.  
  1321.   '0 ratings played
  1322.   strSQL = "SELECT Songs.Rating, Count(Songs.ID) AS CountOfID, Sum(SongLength) AS TotalLength, Sum(FileLength) AS TotalFileLength FROM Songs WHERE Songs.Rating = 0 AND Songs.ID IN (SELECT Played.IDSong FROM Played)"
  1323.   Set qryStats = SDB.Database.OpenSQL(strSQL)
  1324.  
  1325.   If CLng(qryStats.StringByName("CountOfID")) > 0 Then
  1326.     While Not qryStats.EOF
  1327.  
  1328.       ' process background threads
  1329.       SDB.ProcessMessages
  1330.  
  1331.       strOut = strOut & "          <tr" & Style() & ">" & vbcrlf
  1332.       strOut = strOut & "            <td>" & qryStats.StringByName("CountOfID") & "</td>" & vbcrlf
  1333.       strOut = strOut & "            <td>" & ShowRating(qryStats.StringByName("Rating"),booForExport) & "</td>" & vbcrlf
  1334.       strOut = strOut & "            <td>" & FormatTime(CCur(NoNull(qryStats.ValueByName("TotalLength"), 0))) & "</td>" & vbcrlf
  1335.       strOut = strOut & "            <td>" & FormatFileSize(CCur(NoNull(qryStats.ValueByName("TotalFileLength"), 0))) & "</td>" & vbcrlf
  1336.       strOut = strOut & "          </tr>" & vbcrlf
  1337.       qryStats.Next
  1338.     Wend
  1339.   End If
  1340.  
  1341.   strOut = strOut & "        </table>" & vbcrlf
  1342.   strOut = strOut & "      <p/>" & vbcrlf
  1343.  
  1344.   strOut = strOut & "      <table border=""0"" cellspacing=""0"" cellpadding=""4"" width=""100%"">" & vbcrlf
  1345.   strOut = strOut & "        <tr><td style='border-bottom-width:0px'>" & vbcrlf
  1346.   strOut = strOut & "          " & SDB.Localize("Generated by ") & "<a href='http://www.mediamonkey.com'>MediaMonkey</a>" & SDB.Localize(" ON ") & MapXML(FormatDateTime(date(), vbLongDate)) & " " & SDB.Localize("at") & " " & MapXml(FormatDateTime(time(), vbLongTime))
  1347.   strOut = strOut & "        </td></tr>" & vbcrlf
  1348.   strOut = strOut & "      </table>" & vbcrlf
  1349.   strOut = strOut & "    <p/>" & vbcrlf
  1350.  
  1351.   strOut = strOut & "  </body>" & vbcrlf
  1352.   strOut = strOut & "</html>" & vbcrlf
  1353.  
  1354.  
  1355.   ' process background threads
  1356.   SDB.ProcessMessages
  1357.  
  1358.   BuildReport = strOut
  1359. End Function
  1360.  
  1361.